package com.bjb.vr.common.result;

import com.bjb.vr.common.utils.DateTimeUtil;

import java.io.Serializable;

/**
 * @description: 通用返回结果工具类
 * @author: HuJingBo
 * @time: 2022/2/16 20:18
 */
public class CommonResult<T> extends BaseResult implements Serializable {

    private static final long serialVersionUID = 1461339701002844203L;

    /**
     * 默认私有构造器
     */
    private CommonResult() {
    }

    /**
     * 构造器-是否成功
     */
    public CommonResult(boolean success) {
        this.setSuccess(success);
    }

    /**
     * 构造器-状态码、响应消息
     */
    public CommonResult(String code, String message) {
        this.setCode(code);
        this.setMessage(message);
    }

    /**
     * 返回一个【默认】的成功操作的结果，默认响应状态码 200
     */
    public static CommonResult Ok() {
        return Ok(BaseErrorCode.SUCCESS);
    }

    /**
     * 返回一个【自定义响应消息】的成功操作的结果
     */
    public static CommonResult Ok(String message) {
        return baseCreate(BaseErrorCode.SUCCESS.getCode(), message, true);
    }

    /**
     * 返回一个【自定义状态】的成功操作的结果
     *
     * @return 成功操作的实例对象
     */
    public static <T> CommonResult<T> Ok(BaseErrorCode message) {
        return baseCreate(message.getCode(), message.getMessage(), true);
    }

    /**
     * 返回一个【默认】的失败操作的结果，默认响应状态码 500
     */
    public static CommonResult Fail() {
        return Fail(BaseErrorCode.UNKNOWN_ERROR);
    }

    /**
     * 返回一个【自定义状态】的失败操作的结果
     *
     * @return 失败操作的实例对象
     */
    public static CommonResult Fail(BaseErrorCode message) {
        return Fail(message.getCode(), message.getMessage());
    }

    /**
     * 返回一个【自定义响应消息】的失败操作的结果
     */
    public static CommonResult Fail(String message) {
        return baseCreate(BaseErrorCode.UNKNOWN_ERROR.getCode(), message, false);
    }

    /**
     * 返回一个【自定义状态、响应消息】的失败操作的结果
     */
    public static CommonResult Fail(String code, String message) {
        return baseCreate(code, message, false);
    }

    /**
     * 创建返回结果的方法
     */
    private static <T> CommonResult<T> baseCreate(String code, String message, boolean success) {
        CommonResult result = new CommonResult();
        result.setCode(code);
        result.setSuccess(success);
        result.setMessage(message);
        result.setTimestamp(DateTimeUtil.nowStrTime());
        return result;
    }

    /**
     * 自定义返回数据
     */
    public CommonResult<T> setResult(T data) {
        this.setData(data);
        return this;
    }

    @Override
    public T getData() {
        return (T) super.getData();
    }
}
